﻿using Autofac;
using Autofac.Integration.Mvc;
using System.Linq;
using System.Reflection;
using System.Web.Mvc;

namespace Yyyg.WebUI.App_Start
{
    public static class AutofacConfig
    {
        /// <summary>
        /// 负责调用autofac框架实现业务逻辑层和数据仓储层程序集中的类型对象的创建
        /// 负责创建MVC控制器类的对象(调用控制器中的有参构造函数),接管DefaultControllerFactory的工作
        /// </summary>
        public static void Register()
        {
            /*
             *  服务生命周期：
             *  案例参考 https://www.cnblogs.com/wyy1234/p/9140823.html
             *  每个依赖一个实例（InstancePerDependency）
             *  单个实例（SingleInstance）
             *  每个生命周期范围一个实例 (InstancePerLifetimeScope)
             *  每个匹配的生命周期范围一个实例(InstancePerMatchingLifetimeScope)
             *  每个请求一个实例( InstancePerRequest)
             *  每个 Owned 一个实例 ( InstancePerOwned)
             */

            //实例化一个autofac的创建容器
            var builder = new ContainerBuilder();

            #region 注册控制器
            //告诉Autofac框架，将来要创建的控制器类存放在哪个程序集 (AutoFacMvcDemo)
            //Assembly controllerAss = Assembly.Load("Yyyg.WebUI");
            //注册所有控制器
            builder.RegisterControllers(typeof(MvcApplication).Assembly).PropertiesAutowired();
            #endregion

            #region 注册逻辑类
            //告诉autofac框架注册业务逻辑层所在程序集中的所有类的对象实例
            Assembly serviceAss = Assembly.Load("Yyyg.BLL");
            builder.RegisterAssemblyTypes(serviceAss)
                .Where(t => t.Name.EndsWith("Service"))
                //注册所有其实现的接口
                .AsImplementedInterfaces();
            #endregion

            //注册EF
            builder.RegisterType<Yyyg.Models.LuckyEntities>()
                .InstancePerRequest();

            //创建一个Autofac的容器
            var container = builder.Build();
            //将MVC的控制器对象实例 交由autofac来创建
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }
    }
}